/**
 * @param {number} numCourses
 * @param {number[][]} prerequisites
 * @return {boolean}
 */
var canFinish = function (numCourses, prerequisites) {
  let graph = new Map() // 创建一个图
  for (let edge of prerequisites) {
    // 遍历每一条边
    let from = edge[1] // 来自
    let to = edge[0] // 去往
    if (!graph.has(from)) { // 如果没有这个的话 
      graph.set(from, []) // 把这个设置成一个空的set
    }
    let arr = graph.get(from)
    arr.push(to)
    graph.set(from, arr)// 把这个目的 加入的这个set结构中
  } // 这样就建立了一个图了
  console.log(graph)
  // 图的遍历 
  // 需要一个visitied数组
  let visitied = new Array(numCourses).fill(false) // 初始化visited数组
  let onPath = new Array(numCourses).fill(false) // 记录是否走过的路径
  let hasCycle = false // 是否有环
  for (let i = 0; i < numCourses; i++) {
    dfs(i)
  }
  return !hasCycle
  function dfs (s) { // s表示这个的节点编号
    if (onPath[s]) {
      // 如果这个是在这个路径上 表示有环
      hasCycle = true
    }
    if (visitied[s] || hasCycle) {
      // 如果说这个访问过了 或者说这个 是有环的 那就直接retrun
      return
    }
    // 如果没访问过也没有环 那就标记为以遍历
    visitied[s] = true
    onPath[s] = true // 标记这个是在path上
    for (let t of graph.get(s)) {
      // 拿出所有的能去的数组
      dfs(t) // 递归的判断这个能去的数组
    }
    onPath[s] = false
  }
};
let numCourses = 2, prerequisites = [[1, 0]]
console.log(canFinish(numCourses, prerequisites));